package com.code.lightning.sql;

import com.code.lightning.code.base.BasicDBConnect;
import lombok.extern.slf4j.Slf4j;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *
 */
@Slf4j
public class SqlHelper {

    public final static String COLUMN_KEY_CODE = "#LightingCode#";

    public enum SqlTypeEnum{

        /** SQL类型名称 */
        SELECT("SELECT"),
        UPDATE("UPDATE"),
        DELETE("DELETE"),
        INSERT("INSERT");
        /** SQL类型名称 */
        private String name;

        SqlTypeEnum(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    };
    /* ================== SQL执行 ================== */
    /**
     * SQL语句执行工具
     */
    // 返回此 ResultSet 对象中的列数。
    //ResultSet.getMetaData().getColumnCount()
    // 获取用于打印输出和显示的指定列的建议标题。
    //ResultSet.getMetaData().getColumnLabel(int column)
    // 获取指定列的名称。
    //ResultSet.getMetaData().getColumnName(int column)
    // 检索指定列的 SQL 类型。
    //ResultSet.getMetaData().getColumnType(int column)
    // 检索指定列的数据库特定的类型名称。
    //ResultSet.getMetaData().getColumnTypeName(int column)
    public static Map<String,Object> executeSQL(Connection connection,String sql) {
        Map<String,Object> map = new HashMap<>();
        List<String> keys = new ArrayList<>();
        PreparedStatement pstmt = null;
        ResultSet resultSet = null;
        try {
            pstmt = connection.prepareStatement(sql);
            //判断sql类型
            sql = sql.trim();
            int i = sql.indexOf(" ");
            if(i!=-1){
                String type = sql.substring(0,i).toUpperCase();
                if(SqlTypeEnum.SELECT.getName().equals(type)){
                    resultSet = pstmt.executeQuery();
                    List<Map<String,Object>> list = new ArrayList<>();
                    ResultSetMetaData metaData = resultSet.getMetaData();
                    int columnCount = metaData.getColumnCount();//列数

                    for(int j=1;j<columnCount+1;j++) {
                        String columnName = metaData.getColumnName(j);
                        keys.add(columnName);
                    }

                    while (resultSet.next()){
                        Map<String,Object> objectMap = new HashMap<>();
                        for(int j=1;j<columnCount+1;j++){
                            String columnName = metaData.getColumnName(j);
                            objectMap.put(columnName,resultSet.getObject(columnName));
                        }
                        list.add(objectMap);
                    }

                    map.put("data",list);
                    map.put(COLUMN_KEY_CODE, keys);
                    map.put("message","sql执行成功,查询了"+list.size()+"条");
                }else if(SqlTypeEnum.UPDATE.getName().equals(type)||SqlTypeEnum.DELETE.getName().equals(type)||SqlTypeEnum.INSERT.getName().equals(type)){
                    pstmt.execute();
                    map.put("message","sql执行成功，影响了"+pstmt.getUpdateCount()+"条");
                }
                map.put("type",type);
            }else{
                throw new SQLException();
            }
        } catch (SQLException throwables) {
            map.put("success",false);
            map.put("message","sql语句执行出错！");
            return map;
        }finally {
            BasicDBConnect.close(connection, pstmt, resultSet);
        }
        map.put("success",true);
        return map;
    }
}